/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * JThisServerSettingsDialog.java
 *
 * Created on 06.04.2009, 16:50:00
 */

package baseservergrid;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import Network.NetworkAddress;

/**
 *
 * @author Ustinov ID = 1008, Алексей ID = 2001
 */
public class JThisServerSettingsDialog extends javax.swing.JDialog {
    //JTable OldTable;
    //модель таблицы ведомых серверов
    private DefaultTableModel tableModel;
    //результат выполнения окна
    private boolean result=true;

    /** признак диалогового окна для арбитра */
    private boolean isArbitr=true;

    /**
     * @author Aleksey
     * Поучить массив указаных серверов для соединения
     * @return массив адресов серверов
     */
    public LinkedList<NetworkAddress> getServers(){
        //получить модель
        LinkedList<NetworkAddress> res = new LinkedList<NetworkAddress>();
        //заполнить массив адресов
        for(int i=0;i<tableModel.getRowCount()-1;i++){
            String strPort = (String) tableModel.getValueAt(i, 1);
            String host = (String) tableModel.getValueAt(i, 0);
            int port = Integer.parseInt(strPort);
            res.push(new NetworkAddress(host, port));
        }
        return res;
    }

    /**
     * Установить список ведомых адресов
     * @param addresses
     */
    public void setServers( NetworkAddress[] addresses){
        //вывести входные параметры на консоль
        if(ModeCompilation.DEBUG){
            if(addresses==null)
                System.out.println("JThisServerSettingsDialog: "+
                        "Для диалога не установлен список серверов");
            else
                System.out.println("JThisServerSettingsDialog: "+
                        "Для диалога установлен список серверов:\n"+
                        addresses.toString());
        }
        //очистить модель
        for(int i=tableModel.getRowCount()-1;i>=0;i--)
            tableModel.removeRow(i);
        //копировать данные в модель
        if(addresses!=null)
            for(NetworkAddress na:addresses)
                tableModel.addRow(new Object[]
                    {na.getHost(),na.getPort()});
        //добавить последнюю строку
        tableModel.addRow(new Object[]{"",""});
    }

    /**
     * @autor Volk ID = 1001
     * @return получить IP-адресс сервера
     */
    public String getIP(){
     return txtArbAddress.getText();
    }

    /**
     * @autor Volk ID = 1001
     * Установить новое значение IP-адреса
     * @param IP - новое значние IP-адреса
     */
    public void setIP(String IP){
     txtArbAddress.setText(IP);
    }

    /**
     * Установить новое значение порта
     * @autor Volk ID = 1001
     * @param port - новое значение порта
     */
    public void setPort(int port){
     txtArbPort.setText(""+port);
    }

    /**
     * Получить порт сервера
     * @autor Volk ID = 1001
     * @return порт сервера
     */
    public int getPort(){
     return Integer.parseInt(txtArbPort.getText());
    }

    /**
     * Установить значение собственного порта
     * @param port номер порта
     */
    public void setMyPort(int port){ txtMyPort.setText(String.valueOf(port));}

    /**
     * Запросить значение собственного порта
     * @return порт
     */
    public int getMyPort(){ return Integer.parseInt(txtMyPort.getText()); }

    /**
     * Установить значение собственного адреса
     * @param address адрес
     */
    public void setMyAddress(String address){ txtMyAddres.setText(address); }

    /**
     * Запросить значение собственного адреса
     * @return адрес
     */
    public String getMyAddress(){ return txtMyAddres.getText(); }


    /**
     * Получить результат выполнения окна
     * @return true - нажатие "Применить", false - "Отмена"
     */
    public boolean getResult(){ return result; }

    /**
     * Установить тип отображения
     * @param isArbitr true - арбитр, false - ведомый
     */
    public void setArbitr(boolean isArbitr){
        this.isArbitr=isArbitr;
        //изменить отображение элементов
        tablePane.setVisible(isArbitr);
        lblSlaveAddress.setVisible(isArbitr);
        lblArbAddress.setVisible(!isArbitr);
        txtArbAddress.setVisible(!isArbitr);
        lblArbPort.setVisible(!isArbitr);
        txtArbPort.setVisible(!isArbitr);
        //изменить размер окна
        setSize(getPreferredSize());
    }

    /**
     * Обработчик редактирования ячейки таблицы
     */
    private class CellListener implements CellEditorListener{
        /**
         * Прекращение редактирования
         * @param e событие изменения состояния
         */
        @Override
        public void editingStopped(ChangeEvent e) {
            //текущая выделенная строка
            int curR=AddressTable.getSelectedRow();
            if(curR==-1) return;
            //если редактировалась последняя строка
            if(curR==AddressTable.getRowCount()-1){
                //если введены данные - добавить новую пустую строку
                if(tableModel.getValueAt(curR, 0).toString().length()!=0 ||
                        tableModel.getValueAt(curR, 1).toString().length()!=0)
                    tableModel.addRow(new Object[]{"",""});
            }
            else{
                //если из строки стерты значения - удалить
                if(tableModel.getValueAt(curR, 0).toString().length()==0 &&
                        tableModel.getValueAt(curR, 1).toString().length()==0)
                    tableModel.removeRow(curR);
            }
        }

        public void editingCanceled(ChangeEvent e) {
            editingStopped(e);
        }
    }

    /** Creates new form JThisServerSettingsDialog */
    public JThisServerSettingsDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        setResizable(false);
        //начальное отображение элементов
        setArbitr(true);
        //инициализировать модель
        tableModel = (DefaultTableModel) AddressTable.getModel();
        //добавить обработчик для строковых ячеек
        AddressTable.getDefaultEditor(String.class).addCellEditorListener(
                new CellListener());
        //добавить первую строку
        tableModel.addRow(new Object[]{"",""});
        //---------Позиционирования по центру экрана-------------
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension sizeScreen = toolkit.getScreenSize();
        int xPos = (sizeScreen.width - this.getWidth()) / 2;
        int yPos = (sizeScreen.height - this.getHeight()) / 2;
        setLocation(new Point(xPos, yPos));
        //jList1.setListData(listData);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnOK = new javax.swing.JButton();
        btnCancel = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        txtMyAddres = new javax.swing.JTextField();
        txtMyPort = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        lblArbPort = new javax.swing.JLabel();
        txtArbPort = new javax.swing.JTextField();
        txtArbAddress = new javax.swing.JTextField();
        lblArbAddress = new javax.swing.JLabel();
        lblSlaveAddress = new javax.swing.JLabel();
        tablePane = new javax.swing.JScrollPane();
        AddressTable = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Настройка этого сервера");
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                formMouseReleased(evt);
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        btnOK.setText("Применить");
        btnOK.setMaximumSize(new java.awt.Dimension(79, 25));
        btnOK.setMinimumSize(new java.awt.Dimension(79, 25));
        btnOK.setPreferredSize(new java.awt.Dimension(79, 25));
        btnOK.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOKActionPerformed(evt);
            }
        });

        btnCancel.setText("Отмена");
        btnCancel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelActionPerformed(evt);
            }
        });

        jLabel2.setText("Собственный адрес:");

        txtMyAddres.setText("localhost");

        txtMyPort.setText("1099");

        jLabel5.setText("Порт:");

        lblArbPort.setText("Порт:");

        txtArbPort.setEditable(false);
        txtArbPort.setText("1099");

        txtArbAddress.setEditable(false);
        txtArbAddress.setText("127.0.0.1");

        lblArbAddress.setText("Адрес арбитра:");

        lblSlaveAddress.setText("IP-Адреса подчинённых серверов:");

        AddressTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "URL-адрес", "порт"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        AddressTable.setRequestFocusEnabled(false);
        AddressTable.getTableHeader().setReorderingAllowed(false);
        AddressTable.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                AddressTableKeyPressed(evt);
            }
        });
        tablePane.setViewportView(AddressTable);
        AddressTable.getColumnModel().getColumn(1).setMinWidth(70);
        AddressTable.getColumnModel().getColumn(1).setPreferredWidth(70);
        AddressTable.getColumnModel().getColumn(1).setMaxWidth(70);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tablePane, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                    .addComponent(lblSlaveAddress, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(lblArbAddress))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtArbAddress, javax.swing.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE)
                            .addComponent(txtMyAddres, javax.swing.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(lblArbPort, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 42, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(txtArbPort)
                            .addComponent(txtMyPort, javax.swing.GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnOK, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(txtMyAddres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtMyPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblArbAddress)
                    .addComponent(txtArbAddress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtArbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblArbPort))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lblSlaveAddress)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancel, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE)
                    .addComponent(btnOK, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseReleased
        // TODO add your handling code here:
    }//GEN-LAST:event_formMouseReleased

    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened

    }//GEN-LAST:event_formWindowOpened

    private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed
        //вывести результаты на консоль
        if(ModeCompilation.DEBUG){
            System.out.println("JThisServerSettingsDialog: "+
                    "Список серверов:\n"+getServers().toString());
        }
        result=true;
        setVisible(false);
}//GEN-LAST:event_btnOKActionPerformed

    private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed
        /*DefaultTableModel mo = (DefaultTableModel) OldTable.getModel();
        int i;
        for(i=0;i<tableModel.getRowCount();i++){
            tableModel.removeRow(i);
        }
        for(i=0;i<mo.getRowCount();i++){
            tableModel.addRow(new Object[] 
            {mo.getValueAt(i, 0),mo.getValueAt(i, 1),mo.getValueAt(i, 2)});
        }
        AddressTable.updateUI();*/
        result=false;
        setVisible(false);
}//GEN-LAST:event_btnCancelActionPerformed

    private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated
        /*OldTable = new JTable();
        DefaultTableModel mo = (DefaultTableModel) OldTable.getModel();
        DefaultTableModel ma = (DefaultTableModel) AddressTable.getModel();

        Vector cnames = new Vector();
        Vector data;
        for (int j = 0; j < AddressTable.getColumnCount(); j++)
            cnames.add(ma.getColumnName(j));
        data = (Vector) ma.getDataVector().clone();
        mo.setDataVector(data, cnames);
        OldTable.setModel(mo);*/
    }//GEN-LAST:event_formWindowActivated

    /**
     * Обработчик нажатия клавиш для таблицы
     * @param evt событие нажатия
     */
    private void AddressTableKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_AddressTableKeyPressed
        int keyCode = evt.getKeyCode();
        //проверить нажатие delete
        if(keyCode==KeyEvent.VK_DELETE){
            //удалить выделенные строки
            int del[]=AddressTable.getSelectedRows();
            for(int i=del.length-1;i>=0;i--) 
                //удалить все кроме последнего
                if(del[i]!=tableModel.getRowCount()-1) 
                    tableModel.removeRow(del[i]);

        }
    }//GEN-LAST:event_AddressTableKeyPressed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTable AddressTable;
    private javax.swing.JButton btnCancel;
    private javax.swing.JButton btnOK;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel lblArbAddress;
    private javax.swing.JLabel lblArbPort;
    private javax.swing.JLabel lblSlaveAddress;
    private javax.swing.JScrollPane tablePane;
    private javax.swing.JTextField txtArbAddress;
    private javax.swing.JTextField txtArbPort;
    private javax.swing.JTextField txtMyAddres;
    private javax.swing.JTextField txtMyPort;
    // End of variables declaration//GEN-END:variables

}
